package com.base.po.pdd_sdk;

import com.base.helper.WebHelper;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 必要的头部请求参数
 * 
 * @author max
 *
 */
public class PddClient {
	private String url; // 请求的URL地址
	private String client_secret; // 拼多多client_secret
	private String access_token; // 通过code获取的access_token
	private List<String> topPar = new ArrayList<>(); // 必要的头部请求参数

	/**
	 * 请求参数
	 * 
	 * @param url           URL地址
	 * @param type          API接口名称
	 * @param client_id     POP分配给应用的client_id
	 * @param client_secret 拼多多client_secret
	 */
	public PddClient(String url, String type, String client_id, String client_secret) {
		super();
		this.url = url;
		this.client_secret = client_secret;
		topPar.add("type=" + type);
		topPar.add("client_id=" + client_id);
		topPar.add("timestamp=" + System.currentTimeMillis());
	}

	/**
	 * 请求参数
	 * 
	 * @param url           URL地址
	 * @param type          API接口名称
	 * @param client_id     POP分配给应用的client_id
	 * @param client_secret 拼多多client_secret
	 * @param data_type     响应格式
	 */
	public PddClient(String url, String type, String client_id, String client_secret, String data_type) {
		super();
		this.url = url;
		this.client_secret = client_secret;
		topPar.add("type=" + type);
		topPar.add("client_id=" + client_id);
		topPar.add("data_type=" + data_type);
		topPar.add("timestamp=" + System.currentTimeMillis());
	}

	/**
	 * 请求参数
	 * 
	 * @param url           URL地址
	 * @param type          API接口名称
	 * @param client_id     POP分配给应用的client_id
	 * @param client_secret 拼多多client_secret
	 * @param access_token  通过code获取的access_token
	 * @param data_type     响应格式
	 * @param version       API协议版本号
	 */
	public PddClient(String url, String type, String client_id, String client_secret, String access_token,
			String data_type, String version) {
		super();
		this.url = url;
		this.client_secret = client_secret;
		this.access_token = access_token;
		topPar.add("type=" + type);
		topPar.add("client_id=" + client_id);
		topPar.add("data_type=" + data_type);
		topPar.add("version=" + version);
		topPar.add("timestamp=" + System.currentTimeMillis());
	}

	/**
	 * @param req 请求的接口参数
	 */
	public String execute(List<String> req) {
		topPar.addAll(req); // 在头部参数追加请求的参数集合
		String[] arrayToSort = new String[topPar.size()]; // 数组
		for (int i = 0; i < arrayToSort.length; i++) {
			arrayToSort[i] = topPar.get(i); // List集合转为数组
		}
		try {
			Arrays.sort(arrayToSort, String.CASE_INSENSITIVE_ORDER); // 数组英文首字母排序
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace(); // 错误
		}
		StringBuilder sign = new StringBuilder(); // 封装SIGN
		StringBuilder url = new StringBuilder(); // 封装URL
		sign.append(client_secret); // 先在需要签名的字符串追加拼多多client_secret
		for (int i = 0; i < arrayToSort.length; i++) {
			url.append("&" + arrayToSort[i]); // 拼接需要请求的URL参数
			sign.append(arrayToSort[i].replaceFirst("=", "")); // 删除“=”并拼接需要签名的字符串
		}
		sign.append(client_secret); // 在需要签名的字符串尾部追加拼多多client_secret
		try {
			url.insert(0, "sign=" + PddMD5Request.Bit32(sign.toString())); // 在请求的URL参数头部追加签名
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace(); // 错误
		}
		if (access_token != null) {
			url.append("&access_token=" + access_token); // 如果通过code获取的access_token不为空 则在请求的URL参数尾部追加
		}
		String json = null; // 返回的JSON参数
		try {
			json = WebHelper.PostData(this.url + "?" + url.toString(),null, "text/html; charset=UTF-8", null);
//			json = PddHttpRequest.sendPost(this.url, url.toString());
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace(); // 错误
		}
		return json;
	}

}
